package day17.api;
//测试 单例设计模式
public class Test3_Singleton {
    public static void main(String[] args) {
        Hello h = Hello.get();
        Hello h1 = Hello.get();
        System.out.println( h == h1);//true

        Hello2 hello2 = Hello2.get();
        Hello2 hello3 = Hello2.get();
        System.out.println(hello2 == hello3);//true
    }
}
//TODO 懒汉式--面试的重点!!!--延迟加载--线程安全
class Hello2{
    private Hello2(){}
    //TODO 创建对象的时机晚了!!! --按需加载--延迟加载
    static private Hello2 h ;
//TODO 共享资源h是静态的,而且被多条语句操作,肯定不安全.需要加锁.
// 而且锁对象分配的必须是类名.class才安全
  //TODO 锁方法,普通方法的锁对象默认是this.静态方法的锁对象默认就是类名.class
    synchronized static public Hello2 get(){
  //TODO 锁代码块:想锁静态的共享资源,,锁对象必须也是类名.class
//        synchronized (Hello2.class){
            if(h == null){
                h = new Hello2();//没new过,才new
            }
            return h;
//        }
    }
}
//饿汉式 -- 方便使用
class Hello{
    //1,私有化构造方法
    private Hello(){}
    //2,自己new一个
    //加static是因为要被静态的get()调用--静态只能调静态
    static private Hello hello = new Hello();
    //3,提供一个方法,把hello返回
    //加static 是因为这个类不能通过new对象来调用get()
    static public Hello get(){
        return hello;//把自己创建好的hello对象返回调用位置
    }
}



